package com.knife.common.utils;


import com.knife.common.exception.CommonException;
import org.hibernate.validator.HibernateValidator;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Set;

/**
 * @Author qiang.zhang
 * @Date 2021-10-31 14:53
 * @Description
 * hibernate-validator 框架校验参数
 */
public class KnifeValidationUtil {

    /**
     * 通过设置 failFast 来配置，快速失败模式和普通模式
     * 快速失败：当一个字段校验失败时就会返回
     * 普通模式：所有字段都校验完才会结束
     */
    private static Validator validator = Validation.byProvider(HibernateValidator.class).configure().failFast(false).buildValidatorFactory().getValidator();

    /**
     * 方法使用：
     *
     * ValidationUtil.validate(t)  t 是要校验的实例对象
     * 要检验的对象在属性上加常用的注解（其他注解参考官方文档）
     *
     * @NotEmpty(message="xxx不能为空串")
     * @NotBlank(message="xxx不能为空串或者空格")
     * @NotNull(message="xxx不能为 null")
     * @Pattern(regexp="正则表达式",message ="xxx格式不正确")
     *
     * @param obj
     * @param <T>
     * @throws CommonException
     */
    public static <T> void validate(T obj) throws CommonException {
        StringBuilder exceptionInfo = new StringBuilder();
        Set<ConstraintViolation<T>> constraintViolations = validator.validate(obj);
        // 抛出检验异常
        if (constraintViolations.size() > 0) {
            constraintViolations.forEach( line -> {
                exceptionInfo.append(line.getMessage()).append(";");
            });
            throw new CommonException(String.format("数据异常:%s", exceptionInfo.toString()));
        }
    }
}
